Image to CSS
Warning: 我警告过了,浏览器弱爆了的就不要点开了= =。内存太小了就慎重打开= =
眼残,竟然看到这种奇葩的演示
看了看CSS源码,想起来可以用Python Image Library做一个generator。
结果就真得做了一个……
Codes
1 | #! /bin/env python |
Demo
意义?
意义在于可能你会死机= =
尝试复制看看?
开放、分享、自由与进步
Warning: 我警告过了,浏览器弱爆了的就不要点开了= =。内存太小了就慎重打开= =
眼残,竟然看到这种奇葩的演示
看了看CSS源码,想起来可以用Python Image Library做一个generator。
结果就真得做了一个……
1 | #! /bin/env python |
意义在于可能你会死机= =
尝试复制看看?
警告:浏览器可能不支持html嵌入标签,那么很抱歉什么视频也看不到。建议使用最新稳定版的firefox/chromium
仿真的时候面向对象会很方便。
某天终于没有雾霾的时候,我在操场上追赶正在散步的父亲……然后,我就想多了= =跟踪导弹是个什么轨迹呢?

首先把问题简化下,如果从圆心开始追赶圆上匀速运动的物体,是什么情况。
我先自己设法用微分笔算了算,发现实在搞不定。
上网查查导弹问题看到一些简单的直线问题,都涉及一堆微分方程和欧拉法迭代啥的……
干脆自己仿真下吧。这是最初的版本,完全没有面向对象概念。
前半部分调整图像的代码完全可以不看,从while循环开始即可。
1 | import matplotlib.pyplot as plt |
我发现如果我速度够慢,未必追得上,甚至连被追踪物的轨道都不会进入……这挺出乎意料的,本来以为一定追的上
回到最初的问题,我从我的位置上追我父亲(好傻,都不知道估计下位置……)
问题来了,如果我要仿真不只一个追踪导弹,比如还想仿真一个拦截导弹呢?
拦截失败演示
还可以用上面的方法不断扩充代码,每个对象写重复的代码。
但这时面向对象就能发挥威力,减少代码重用了。
以下是对四蜗牛聚合线问题的仿真。
1 | import matplotlib.pyplot as plt |
面向对象方法对仿真问题非常合适,能有效简化代码,做到DRY(Don’t repeat yourself)。
搞着玩的,也许我该想想复试怎么办了……
Inspired by this online image to text converter and this post on Oschina
script hosts at github. Poor hack, Any advice is welcomed.
Edit: Oooops, Demo sucks on my site, it’s perfect if you generate an alone html file.look here and here
1 | #! /bin/env python |
Update: Mon 25 Feb 2013 11:38:47 AM CST add classic style. More refer to github
Python是面向对象的?没有对象面向毛对象。
——Anonymous
Several weeks ago, I saw a poster of presidential campaign for Obama, in which Obama’s portrait was made up of many voter’s photos. It really attracted me, somedays later, I want to make one myself.
The completed code host here. It is much more functional than object-oriented…
First of all, I searched the Google to find out how others achieve it, then I found many interesting implement and post on it.Along with them, there are pretty demos around.One of the demo of Foto-Mosaik-Edda striked me.It declaims as follows in their site:
The Chaos Mosaic Picture is a new form of photo mosaic which can, at present, only be created by Foto-Mosaik-Edda.

Uhm…Foto-Mosaic-Edda is an open-source project that really impressive.But it was an C# project. Linux users don’t like it however.I don’t like mono.
I searched other open-source implement on photomosaic. I get some simple programs only use gray photos, and some complex ones can make beautiful classic photomosaic(like metapixel, even chaos style which it calls collage style), But none has as beautiful demos as Foto-Mosaic-Edda.(metapixel really amazing, it is robust and quickly.)
However, I saw many enthusiastic people write one themselves, it really looks interesting for me. I’ve used PIL for processing images when I tried to decode captchas several days ago, so I believe with the help of PIL, someone can achieve photomosaic simply.
So I just read the documentation of PIL, then start my hack.
It’s not hard, however, what you should do is clear and simple:
I’d like to got the chaos style, so some other requirements:
Now, let’s go.
first add frame, shadow to small images
1 | def add_frame(image): |
Then a function to rotate images.
1 | def rotate_image(image, degree): |
‘RGBA’ mode is to support transparency. What’s matter here is that jpeg/jpg does not support transparency. So you can’t get transparency shadows and rotate pictures if you just use jpg/jpeg images.So, write a function to process images with jpg/jpeg format, transpose it into png.
1 | def process_image(filename, newname): |
Really poor work… But it works for me: )
We have to thumnail bunches of images, It’s easy to thumbnail with PIL:
1 | def thumbnail(im, size): |
Let’s have a fun with them. To get heaps of images randomly on the desktop, I hardcoded these parameters to get my photos work, you HAVE TO find yours:
1 | # Just for fun |
Get average colors of an image
1 | def average_image(im): |
to compare images? Compare the (r,g,b) value of them.
1 | def compare_vectors(v1, v2): |
I just use distance in (R, G, B) space to calculate similarity, someone advice compare in other space, you can change it just like the example in PIL’s documentation:
1 | # May not useful |
But I find many implements just use R,G,B, and it works well.
Next, get a dict of image in current path, in which filename as key, average (R,G,B) colors as value.
1 | def tile_dict(path): |
We don’t need to calculate every pixel of the large picture, just thumbnail it to get a nearest color of different regions.
1 | def thumbnail_background(im, scale): |
For every pixel in the thumbnailed large image, find most similar small image filenames.(top ten):
1 | def find_similar(lst, dic): |
Poor hack, but it really works…
Now it’s the final magic.
Get the small image in order, the order imply where it should be. Then rotate, add shadows and frames for small images, finally paste it onto the large one randomly in the right position:
1 | def get_image_list(im, dic): |
I try it like this, I know parameter n is tricky, it was the scale it thumbnail the large image. Maybe I’ll change it to something more clear later…
1 | def main(filename, n, scale, iteration, path='./'): |
Do you like it?

Can you see it?
More examples here(Chinese)
My family, It supports me.Never let me down, never pour cold water, never scold for insignificance.
目录
受R分析人人网好友推荐系统和用python进行人人好友分析启发,完全用python的模块和方式实现了一遍,结果搞得好像一点也不Pythonic,倒好像有点继承了之前在lisp下养成的函数式风格……
作为菜鸟深知代码写得不怎么样,写在这里,希望没什么基础的人都能体会到其中我所感受到的乐趣Happy hacking,也欢迎各路高手大牛不吝赐教。
完整代码见github/reverland/scripts/renren.py
For Reader:
读者需要有一定python基础,如果没有,不妨花半个小时看看Python简明教程。
For Computer:
我在gentoo linux下完成所有的编写测试,也推荐想尝试的朋友选择linux环境。不过只是推荐,python作为著名的跨平台语言,其代码可以没什么差别的运行在各个平台上,但你需要以下一些必备的东西:
怎么安装请自行参照官方网站说明。对后两个模块,建议使用pip安装,这货就相当于个包管理器(一条命令完成搜索下载安装所有操作并自动处理所有依赖)。
最后,还有可选的开发环境:ipython,该程序提供一个功能强大的交互环境,很方便做测试调试探索各种 一次性 工作。
从人人网上抓取好友,绘制好友之间的关系图,还可以供进一步分析(貌似没什么好分析的)。
为了实现这点我们需要做到以下几个工作:
人人的模拟登录还是比较简单的。模拟登录最困难的部分就是对要登录网站登录过程的分析。通常办法是通过抓包,用wireshark总有种杀鸡用牛刀的感觉,而且当你像作者一样天天用socks代理时会发现什么也抓不到……所以IE/Chrome/Firefox的开发工具可能更合适。这里用firebug,你可以在火狐扩展中心找到并安装它。

然后在抓包过程中找到用户名^2和登录时请求的服务器。
不过,之前有很多人已经分析过人人的登录过程(一般不会要求验证码,除非登录过于频繁)。你所必须要做的基本上只有两件事:
模拟登录的工具使用python的标准库中的urllib,urllib2和cookielib即可
1 | import urllib |
如果对这三个标准库不熟悉,建议花时间看看下面两篇教程。不过也许无所谓,代码可以自己解释自己:p。
当浏览器使用POST方法请求服务器时,它将参数经过编码附加到url后传递过去:
http://www.renren.com/ajaxLogin/login&email=username&password=blablabla
登录成功后,还要获取人人中用来作为用户唯一标识额uid(打开人人主页注意url就看到了)并返回,以供将来使用。将来所有的抓取都通过独一无二的uid而非可能重名的姓名。
使用正则抓去uid
import re
我们先写登录函数:
1 | def login(username, password): |
不妨在ipython中先测试下。
每个人的好友都可以从页面http://friend.renren.com/GetFriendList.do?curpage=0&id=uid获取,虽然人人已经改版,但这个页面还能用。其中curpage参数的值是页码,id参数的值是拟抓取对象的用户ID。通过循环抓取所有好友并以用户id为键姓名为值保存为字典。
1 | def getfriends(uid): |
我们再写个获取好友关系字典的函数,为了避免我们每次为了获取字典都要登录抓取。
1 | def getdict(uid): |
我们还需要一个用来判断两个人关系的函数,来判断我们好友之间的关系。
1 | def getrelations(uid1, uid2): |
利用以上函数判断好友关系并通过networkx创建一个相应的网络。
1 | def getgraph(username, password): |
最后是绘图函数,有很多控制图像输出的参数,可能多次调整才会得到想要的图像。在matplotlib画出的图像在窗口中也可以放大缩小选取适当范围。
1 | def draw_graph(username, password, filename='graph.txt', label_flag=True, remove_isolated=True, different_size=True, iso_level=10, node_size=40): |
把以上函数写进一个文件比如说renren.py,在ipython中导入。
1 | In[1]: from renren import * |

通过图像你会发现。这些绘图软件的算法相当不错的,你会发现很明显的聚类,这一片是大学同学、这片是小学初中同学,旁边与之联系紧密的是高中同学,这一片孤立的是网友等等。
也许你还会发现你的某些好友竟然相互认识。
抓取下来的数据还可以留待其它研究

你也许会发现有的好友和你的共同好友多得超乎他人,也许发现共同好友分布比较均匀
就这么多这么简单。
希望你也能体会到这个乐趣横生的过程,对我来说,探索和学习的过程是相当意趣盎然的,折腾出来还相当有成就感呢。
如果你想让matplotlib显示中文,你需要修改matplotlibrc更改字体。但有一种更通用的办法可以不用修改配置文件。自行google。
ps:这回开高亮了,没感觉和不高亮有啥大区别。感觉还是vim中的高亮漂亮啊,哪天不用pygments直接用vim converto html = =
[^1]:从来没用过api,搞不懂人人api,试着创建个应用Post过去结果认证失败,也没打算申请应用……总之不会搞= =
注:代码写得很烂,不过感觉挺好玩所以写在这里。欢迎各路大牛指教。完整代码见github/reverland/scripts/tagcloud.py
曾经在linux用户中流行这么一个命令
~ ⮀ history | awk '{CMD[$2]++;count++;} END { for (a in CMD )print CMD[ a ]" " CMD[ a ]/count*100 "% " a }' | grep -v "./" | column -c3 -s " " -t |sort -nr | nl | head -n20
1 852 24.3012% sudo
2 376 10.7245% pacman
3 163 4.64917% vim
4 133 3.7935% tsocks
5 101 2.88078% cd
6 95 2.70964% kill
7 88 2.50998% eix
8 70 1.99658% python2
9 70 1.99658% emerge
10 69 1.96805% ls
11 63 1.79692% git
12 54 1.54022% gcc
13 51 1.45465% pip2
14 39 1.11238% python
15 37 1.05533% pip
16 37 1.05533% nmap
17 35 0.998289% su
18 32 0.912721% xrandr
19 31 0.884199% rvm
20 27 0.770108% ssh
多cool的一个命令……我完全看不懂awk啥的……几天前看The practice of computing using python,上面讲到简单的文本处理和标签云,便想到把shell history用标签云的方式可视化出来。就是这样,我啥也不会。
先把shell历史定向到一个文件中吧,或者把zsh_history啥复制下
history > hist.txt
然后如何可视化呢?抱着有需求先搜寻有没有开源实现的想法找到了pytagcloud,稍加调整,生成的标签云相当漂亮:
oops!好大两个“异常词”,这么说一看我就是sudo党了,而且是经常滚的arch党……
为了看清更多细节,反映更多客观事实把这两个词去掉
看上去好多了………
pytagcloud还提供生成html数据的函数,你可以在线看看效果:
其实自己实现类似的效果很简单,获得更明晰的理解和灵活性。
先给出以下要用的控制大小的参数,后面将直接用到它们。你可能需要多次调整来探索适合自己的数值,事实上,为了生成不同文本的标签云我试过了几十次。
boxsize = 600
basescale = 10
fontScale = 0.5
omitnumber = 5
omitlen = 0
我们刚才保存的hits文件是这样的:
2480 pacman -Ss synap
2481 sudo pacman -S synaptiks
2482 synaptiks
2483 pypy
2484 vim pypy.py
2485 pypy pypy.py
2486 pip2 freeze
2487 pip2 freeze|grep flask
2488 pip2 install Flask
2489 pip2 install --upgrade Flask
显然我们只要每行第二个词就行,这个任务很简单,我选择先将所有命令合并成一个大字符串,因为最开始我是直接用pytagcloud来生成标签云的,而它的示例代码用的是整个字符串:
def cmd2string(filename):
'''accept the filename and return the string of cmd'''
chist = []
# Open the file and store the history in chist
with open(filename, 'r') as f:
chist = f.readlines()
# print chist
for i in range(len(chist)):
chist[i] = chist[i].split()
chist[i] = chist[i][1]
ss = ''
for w in chist:
if w != 'sudo' and w != 'pacman':
ss = ss + ' ' + w
return ss
接着将字符串转换成字典,单词为键,出现次数为值:
def string2dict(string, dic):
"""split a string into a dict record its frequent"""
wl = string.split()
for w in wl:
if w == '\n': # 因为后来我看到中文分词结果中有\n...
continue
if w not in dic:
dic[w] = 1
else:
dic[w] += 1
return dic
接下来的两个函数来自之前我提到的那本书,稍微改动下让它在firefox18下正常显示,并且稍作美化,更改为随机的字体色彩和黑色背景。
这两个函数的含义是不言自明的,必要的html/css知识是需要的。[^1]
def makeHTMLbox(body, width):
"""takes one long string of words and a width(px) then put them in an HTML box"""
boxStr = """<div style=\"width: %spx;background-color: rgb(0, 0, 0);border: 1px grey solid;text-align: center; overflow: hidden;\">%s</div>
"""
return boxStr % (str(width), body)
def makeHTMLword(body, fontsize):
"""take words and fontsize, and create an HTML word in that fontsize."""
#num = str(random.randint(0,255))
# return random color for every tags
color = 'rgb(%s, %s, %s)' % (str(random.randint(0, 255)), str(random.randint(0, 255)), str(random.randint(0, 255)))
# get the html data
wordStr = '<span style=\"font-size:%spx;color:%s;float:left;\">%s</span>'
return wordStr % (str(fontsize), color, body)
Now, it’s time to get the proper html files of the tag cloud!
# get the html data first
wd = {}
s = cmd2string(filename)
wd = string2dict(s, wd)
vkl = [(k, v) for k, v in wd.items() if v >= omitnumber and len(k) > omitlen] # kick off less used cmd
words = ""
for w, c in vkl:
words += makeHTMLword(w, int(c * fontScale + basescale))
html = makeHTMLbox(words, boxsize)
# dump it to a file
with open(filename.split('.')[0] + '.' + 'html', 'wb') as f:
f.write(html)
将以上内容写到一个文件中,命名为比如说tagcloud.py:
python2 tagcloud.py hist.txt # `import sys` and let filename = sys.argv[1]
# or `run tagcloud.py hist.txt` in ipython
看看效果吧:
相当棒不是么?[^2]
为了深刻领会党的十八大大会精神^3,我做了下我党的十八大报告标签云:
先从网上找到总书记的十八大报告全文,保存为shibada.txt:
中文分词有个相当不错的python库jieba
将单词保存到一个字典中
import jieba
with open('shibada.txt','r') as f:
s = f.read()
wg = jieba.cut(s, cut_all=True)
wd = {}
for w in wg:
if w not in wd:
wd[w] = 1
else:
wd[w] += 1
生成html数据:
for w, c in vkl:
words += makeHTMLword(w, int(c * fontScale + basescale))
html = makeHTMLbox(words, boxsize)
htmlzh = unicode.encode(html,'UTF-8') # Important!
# dump it to a file
with open(filename.split('.')[0] + '.' + 'html', 'wb') as f:
f.write(htmlzh)
嗯……深刻领会了十八大精神^4。
可以将标签云移植到博客上。
[^1]:抱歉……我忘记python怎么将长行划分了\ or \\?
[^2]:emerge 乱入……
这是书评,不仅仅是书评。事实上,这本书我还没看完。考研之前大概两个月时偶然在图书馆外文图书阴暗的角落发现了这本书,然后考研复习平常上课都被我扔了,连续一周徜徉在数学和计算机的世界里。再往后?大概到十四还是十五章被迫准备研究生入学考试去,直到现在还没拾起来。
后来在一楼看到有中文图书,感觉翻译的不错,起码比我自己理解的好。就换了本中文的带回家来看。
废话很多?不是么?好吧这篇书评和书的内容没什么大的关联,满篇只因为我又想 胡扯 了。
Amazon上对这本书的评价:Very Insight。Too insight 以致于我真想跑跑题。
从书上的一个故事说起。作者建议数据分析工作人员和科学家用Unix系统工作,为此专门举了个例子:
True story: I needed to send a file containing several millions of keys to a coworker.(The company did not work on Unix.) Since the file was too large to fit safely into an email message, I posted it to a web server on my desktop and sent my coworker the link. (I dutifully had provided the file with the extension .txt, so that he would be able to open it.) Five minutes later, he calls me back: “I can’t open that”—“What do you mean?”—“Well, I click the link, but ScrapPaper [the default text editor for small text files on this particular system] dies because the file is too big.” This coworker was not inept (in fact, he was quite good at his primary job), but he displayed the particular non-problem-solving attitude that develops in predefined work environments: “Link, click.” It did not even occur to him to think of something else to try. That’s a problem!
就在昨天,看到行者无疆上对百度的公司的风格很是一顿猛批:其为员工预装的系统还是十年前的windows XP,天天用着盗版SecureCRT和Office软件工作。问题是:This matters?
我觉得重要!关键在习惯和文化上!
看看作者如何谈论:
Unix was developed for precisely this kind of ad hoc programming with files
and data, and it continues to provide the most liberating environment for such work.
Unix (and its variants, including Linux and Mac OS X) has some obvious technical
advantages, but its most important property in the present context is that it encourages
you to devise solutions. It does not try (or pretend) to do the job for you, but it goes out of
its way to give you tools that you might find handy—without prescribing how or for
what you use them. In contrast, other operating systems tend to encourage you to stay
within the boundaries of certain familiar activity patterns—which does not encourage
the development of your problem-solving abilities (or, more importantly, your
problem-solving attitudes).
关键就在这里,Unix系统 encourages you to devise solutions, 它不尝试为你做完所有事,但是它竭尽所能为你提供各种各样的工具和选择,而不是规定使用的方式和用途。而其它操作系统往往鼓励你留在习惯的活动模式范围内——毫不鼓励你提高解决问题的能力,更重要的是,解决问题的态度!
这也就是为什么,Linux、Mac OS和BSD这些Unix系统被称作黑客^1的操作系统,而Windows一直饱受诟病,在geek的群体中备受歧视。
从开始接触Linux到现在不到一年半,按理说作为一个noob没什么评头论足的资格,但这一年半却是改变我人生轨迹的一年半,我想分享出来自己的想法和折腾。也为了印证为何我也这么说这么想。
一年半时间,世界和自我完全变了。
折腾的苦与乐,爱与恨,交织纷繁。
也许当初真的太闲了才会一脚踏进这个无底洞,不过,who cares。就说说这个系统和文化如何影响、塑造了我。
故事从SAS开始,一款统计软件。当时数学建模用着盗版的SAS,老师说,这个正版太贵,我们买不起。
问题是有多贵?我开始上百度^2找答案,听说的答案是:一年几十万。
The price shocked me,从来没想过一个软件会这么贵。缘分就在这里,看到有人在推荐R(A powerful statistics environment)作为替代。这是我第一次听说开源,也是我折腾的开始,踏入新天地的开端。
没体会过的人永远不会理解我为什么说新天地,也不会理解这有什么好感慨的。
我从来没想过将来去从事什么计算机相关的工作,从来。从来觉得数学这东西一无是处,都是空谈。从来觉得世界分工很多事情自己都不该去接触去学习。从来以为世界就是自己身边这么大。从来觉得一生这么混混就过去了。
但一年半后我再也不这样想了。依然迷茫,然而有信心。
这一年半我觉得做了许多让自己骄傲的事,最起码没有虚度。虽然在别人眼里我碌碌无为,甚至一无是处。我依然相信、我的所有努力和折腾不会白费。就像Jobs当在Stanford演讲所说[^3]。
一分耕耘、一分收获。
有!文化。有些环境不鼓励探索和设计解决问题,而是鼓励你混日子。
关于开源社区的文化,我想说几条:
大多数人都只因热爱。开源社区是充满热情与爱的社区,开源本身就是个奇迹。你会想到有人无偿将自己的劳动成果贡献出来让所有人都能自由获取和使用吗?然而不光有人做,还有一群人做。他们把技术、心得分享出来,让每个想学习的人都平等的接触他们。他们花费宝贵时间写出组织良好充满热情的文档、教程,录制视频,他们花费宝贵的时间本地化各种应用,在IRC和论坛等地热情帮助他人。他们也做出各种各样的艺术品。
开源社区的分享氛围真是太好了。我为什么倾向于使用Python,因为它本身就是依靠开源发展壮大起来,深受开源文化陶冶的语言。来自各个领域、各个地区的爱好者们开发了各种各样的库分享出来让每个人都能自由获取,以致于很多事情用Python太简单了。数以万计的开源软件使用者在互联网上分享、反馈、改进他们喜欢的东西。这种文化也构成了互联网的分享基础。
正如本书作者在前言中所说:
All You need is just CURIOSITY!
开源社区给了每个人自由平等接触学习的机会,你所需要的仅仅是好奇心。从接触linux开始,我在上面折腾过各种数学软件R、octave、scilab、ipython(其实这不是……)、各种风格和特色语言[^4]、自己学习图像处理的基础知识和使用图像处理软件(如果时间很多就去学blender)[^5]、自己学习字体排版的理论折腾LaTeX、自己试着零基础折腾各种动静态网站、在虚拟机上装好各种linux/windows系统然后连着玩……虽然没学到什么或者学过也忘了或者不深入,但学到的是解决问题的态度和能力,这才是我觉得最重要的。时光飞逝,一切都会过时变化,重要的是面对问题的态度和解决问题的能力。
开源的文化改变了我的思想、行动,开阔了我的眼界,我觉得这对每个人都是有益的。剩下的,就是你愿不愿意付出“代价”来改变自己了。
开放的社区欢迎任何人投入其中、分享、学习、进步,接触和尝试各个领域,你也许对计算机知之甚少,对数学一窍不通,但行业的鸿沟真的这么明显吗?难而不会、会而不难,你会找到很多开放的社区有热情的人分享的资料文章、看到清晰热情的文档、在论坛IRC等获得热心的帮助。
不妨试试,你会爱上这种文化。
最后顺便说下,开源社区创造了很多很棒的东西,越是重要的东西越默默无闻,然而不可或缺。
[^3]:Follow U heart.
[^4]:其实很少,我认真学的第一门语言是common lisp。
[^5]:有兴趣的同学可以去看看Tears of Steel,这是blender、gimp、Inkscape等开源多媒体软件制作的。
警告:渣行文,就是想到什么扯什么……散漫不羁,漫无主题。
注:你也许可以把这篇极水的流水帐当作 Tentative Instruction for gentoo on Samsung R429 不过我写这篇文章的目的在于自我警戒与警戒他人,一次gentoo安装让本屌丝sb本质暴露无疑,诸位看官引以为戒。
Cpu信息,这就是传说中的i3 XD
⚡ root@gentoo ⮀ ~ ⮀ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 2
Core(s) per socket: 2
Socket(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 37
Stepping: 2
CPU MHz: 2266.000
BogoMIPS: 4521.96
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 3072K
硬件:
⚡ root@gentoo ⮀ ~ ⮀ lspci
00:00.0 Host bridge: Intel Corporation Core Processor DRAM Controller (rev 12)
00:01.0 PCI bridge: Intel Corporation Core Processor PCI Express x16 Root Port (rev 12)
00:1a.0 USB controller: Intel Corporation 5 Series/3400 Series Chipset USB2 Enhanced Host Controller (rev 06)
00:1b.0 Audio device: Intel Corporation 5 Series/3400 Series Chipset High Definition Audio (rev 06)
00:1c.0 PCI bridge: Intel Corporation 5 Series/3400 Series Chipset PCI Express Root Port 1 (rev 06)
00:1c.2 PCI bridge: Intel Corporation 5 Series/3400 Series Chipset PCI Express Root Port 3 (rev 06)
00:1c.3 PCI bridge: Intel Corporation 5 Series/3400 Series Chipset PCI Express Root Port 4 (rev 06)
00:1d.0 USB controller: Intel Corporation 5 Series/3400 Series Chipset USB2 Enhanced Host Controller (rev 06)
00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev a6)
00:1f.0 ISA bridge: Intel Corporation Mobile 5 Series Chipset LPC Interface Controller (rev 06)
00:1f.2 SATA controller: Intel Corporation 5 Series/3400 Series Chipset 4 port SATA AHCI Controller (rev 06)
00:1f.3 SMBus: Intel Corporation 5 Series/3400 Series Chipset SMBus Controller (rev 06)
02:00.0 VGA compatible controller: NVIDIA Corporation GT218 [GeForce 310M] (rev a2)
02:00.1 Audio device: NVIDIA Corporation High Definition Audio Controller (rev a1)
03:00.0 Network controller: Atheros Communications Inc. AR9285 Wireless Network Adapter (PCI-Express) (rev 01)
07:00.0 Ethernet controller: Marvell Technology Group Ltd. Yukon Optima 88E8059 [PCIe Gigabit Ethernet Controller with AVB] (rev 11)
3f:00.0 Host bridge: Intel Corporation Core Processor QuickPath Architecture Generic Non-core Registers (rev 02)
3f:00.1 Host bridge: Intel Corporation Core Processor QuickPath Architecture System Address Decoder (rev 02)
3f:02.0 Host bridge: Intel Corporation Core Processor QPI Link 0 (rev 02)
3f:02.1 Host bridge: Intel Corporation Core Processor QPI Physical 0 (rev 02)
3f:02.2 Host bridge: Intel Corporation Core Processor Reserved (rev 02)
3f:02.3 Host bridge: Intel Corporation Core Processor Reserved (rev 02)
2013年一月十三日,开始装gentoo。依照The Gentoo Linux alternative installation method HOWTO从BT5 R3的liveusb来chroot过去部署的stage3。一年多linux使用的结果是,chroot轻车熟路,archwiki中chroot那章还是我翻译的呢,不过……渣翻译。
没什么理由,甚至对arch相当满意。然后就顺手给/和/boot干掉了……单独分区天然优势,不用折腾什么lvm就能大胆的乱搞……
Device Boot Start End Blocks Id System
/dev/sda1 * 63 208844 104391 83 Linux
/dev/sda2 208845 4417874 2104515 82 Linux swap / Solaris
/dev/sda3 4417875 65866499 30724312+ 83 Linux
/dev/sda4 65866500 625137344 279635422+ 83 Linux
这是这次安装和配置gentoo时犯的第一次sb……
当时内核编译好。手册上的示例是grub和lilo做引导,而我习惯syslinux。素来以尊重用户选择为指引的gentoo在手册上就是没提及半点syslinux,而在arch下的操作又不一样。于是找到gentoo的syslinux的wiki。按wiki步骤写了自己的extlinux.conf:
TIMEOUT 30
ONTIMEOUT gentoo
UI vesamenu.c32
MENU TITLE Boot
LABEL gentoo
MENU LABEL Gentoo Linux
KERNEL /boot/kernel-genkernel-x86_64-3.6.11-gentoo
APPEND initrd=/boot/initramfs-genkernel-x86_64-3.6.11-gentoo root=/dev/sda3 acpi_osi=Linux acpi_backlight=vendor
然后重启……无法载入root,进入某个rescue shell内,什么神shell什么命令都没用。
冷关机chroot,查找资料改以上配置文件n次,重装extlinux又n次,重启n次,依然无解。然后忽然发现……extlinux的配置文件是extlinux.conf,而不像syslinux,pxelinux和isolinux那样都是.cfg,瞬间知道自己sb了……
然后还算顺利吧,开源驱动编译了好久,emerge不会用,我是什么都:
emerge --autounmask-write foo
dispatch-conf
u
emerge foo
奇葩的是我想到什么emerge什么……于是搞了好久都没有图形界面用……
搞了个xterm+luit+telnet上听雨……发现字体显示不全……和听雨技术blabla的用英语开始版聊,然后十大了……囧
为了能一边上网水贴吧,一边编译系统。第二天回到BT5的liveusb环境中去了,又把自己喜欢的东西先emerge出来了……图形界面还没起来把gimp和vlc就编译好了……
等开源驱动装好,kdebase-startkde装好之后,重liveusb环境重启,擦……奇葩的分辨率……然后又开始查怎么调分辨率。
然后从开源到闭源,发现闭源不能调亮度,再加上没有kms很不爽,又转到开源。对这款机器来说,估计nvidia-bl驱动你也可以调亮度,不过我没试过。我只是把闭源驱动生成的xorg.conf改了改扔给了开源驱动^3:
⚡ root@gentoo ⮀ ~ ⮀ cat /etc/X11/xorg.conf
# nvidia-xconfig: X configuration file generated by nvidia-xconfig
# nvidia-xconfig: version 304.64 (buildmeister@swio-display-x86-rhel47-12) Tue Oct 30 12:04:46 PDT 2012
Section "ServerLayout"
Identifier "Layout0"
Screen 0 "Screen0" 0 0
InputDevice "Keyboard0" "CoreKeyboard"
InputDevice "Mouse0" "CorePointer"
EndSection
Section "Files"
EndSection
Section "InputDevice"
# generated from data in "/etc/conf.d/gpm"
Identifier "Mouse0"
Driver "mouse"
Option "Protocol"
Option "Device" "/dev/input/mice"
Option "Emulate3Buttons" "no"
Option "ZAxisMapping" "4 5"
EndSection
Section "InputDevice"
# generated from default
Identifier "Keyboard0"
Driver "kbd"
EndSection
Section "Monitor"
Identifier "Monitor0"
Modeline "1368x768_60.00" 85.25 1368 1440 1576 1784 768 771 781 798 -hsync +vsync
Option "DPMS"
Option "PreferredMode" "1368x768_60.00"
EndSection
Section "Device"
Identifier "Device0"
Driver "nouveau"
Option "NoLogo" "true"
Option "RegistryDwords" "EnableBrightnessControl=1"
VendorName "NVIDIA Corporation"
EndSection
Section "Screen"
Identifier "Screen0"
Device "Device0"
Monitor "Monitor0"
DefaultDepth 24
SubSection "Display"
Modes "1366x768"
Depth 24
EndSubSection
EndSection
想知道modeline怎么写的?请man cvt。
总之,这么一搞,开源驱动有这款机器的分辨率了。
这部分最后补充下我犯的第二次sb,chroot过去忘了date到正确的时间,结果早上开始emerge kdebase-startkde 晚上发现它还在等着在多少多少秒之后的未来某时开始编译……于是水了一天贴吧发现什么都没干。
第三次sb在于,妄图打造一个纯正的无gtk环境,
从W城到X城,十个小时的火车,又犯了一次sb。以为早上六点到X城,半夜两点乘务员把我叫起来说到站了,迷迷糊糊的出站四野一片大雾。晕头转向地走进KFC打开电脑等天亮……草……启动不了了。然后我chroot重编译内核检查硬盘内存一直搞到没电。
等到回家,忽然想起光驱里放了个没用的光盘……
回家开始拨号联网,怀念arch下Networkmanager无往不利,按wiki编译设置好。先是发现没无线网络,然后dsl拨号连不上。
这是第几次sb来着……查找N多资料,编译N次内核,n次networkmanager,甚至试了试wicd,最后发现用户名写错了……卧槽啊……
无线内核也是个大坑,gentoo安装手册上说:
Be aware though, as genkernel compiles a kernel that supports almost all hardware, this compilation will take quite a while to finish!
还说:
This means that when you use genkernel to build your kernel, your system will generally detect all your hardware at boot-time, just like our Installation CD does.
于是我sb的以为会生成个和ubuntu或arch一样的通用内核,实际上竟然不完全是。^1不知道是chroot原因还是什么,RTC支持没有编译(hwclock),无线网卡驱动没有编译(ath9k),如果你要用vbox,这个支持也要编译上(iommu)。
我觉得最sb的在于,我以为genkernel会自动读取当前目录的配置……各位看官引以为戒,使用软件前认真看手册,不要自以为是。
好了最后没什么了,一个libreoffice编译了五个小时,添加了gentoo-zh和sunrise的overlay。装上了katawa-shoujo,64位gentoo跑32位程序全无压力,连pulse-audio都不用就有声音(arch下为了发出声音必然的依赖)……
然后……就是开虚拟机写毕业设计开题报告的事了。囧……
这是秀gvim和gentoo的logo:

秀zsh的powerline

这是秀oxygen主题,金属光泽和性感的阴影。

终于可以使用中文了。截止
Sun 13 Jan 2013 12:52:51 AM CST
已完成的工作
[X] vlc
[X] gimp
[X] luit/telnet 上听雨
[X] w3m
[X] nouveau
[X] zsh
[X] wqy-zenhei wqy-microhei
[X] ipython pip (python2)
[X] firefox-bin18
[X] startkde(去除bluez,我没有蓝牙适配器)
[X] ppp,dhcpcd
[X] 通用内核
[X] syslinux
[X] 较低版本的fcitx
[X] layman添加gentoo-zh, 安装git和subversion。
[X] xinit
还有些问题:Mon 14 Jan 2013 12:27:09 AM CST修正
[X] 分辨率低,不能设置为1366x768,换闭源驱动可解决
[C] gentoo的stageball难道给我装了一堆开发工具?sandbox pyshell pycrust pyalamode?
[X] gvim显示好难看,而且输入法不能起作用,gtk选项
[X] oxygen还要单独安装么?bug,重编译解决
[X] 缺少声卡驱动?还是alsa?声音调节。alsa
[X] 触摸板不起作用。synaptics
[X] 亮度无法调节(kde电源管理工具,and powermanage)开源可以闭源不行,acpid acpi Option依然无力[^4]
[X] dolphin,okular,gwenview等常用工具没装
[X] sudo sudoer文件写法
[X]用户组处理
[]摄像头
[X]如果开源驱动,开启kms
[C]change to nvidiabl
Others:
[X] kdm
[X] vbox安装、配置
[X] 重新编译firefox18,而不是bin
[X] oh-my-zsh 换上有非常漂亮powerline的agnoster主题,上图
[C] overlay 更换现有输入法?注意ICU,暂时不更改了
[X] 片轮少女^2
[X] 是否换闭源驱动 是 logo去掉
[X] virtualenv,pip
[C] gcc暂时不升级
幸运的是,家目录没有变动。所有的用户配置都在,如vim,kde,甚至rvm都能正常使用。
Mon 14 Jan 2013 12:30:54 AM CST
除此之外我还做了什么:
[O]恼人的zsh下sudo自动补全。sudo没解决(把配置复制给root了都没用)
[X]精简内核,被genkernel坑了,原来它不会自动读配置
[X]latex编译,ctex字体配置
[X]无线网内核支持编译ath9k
[X]Networkmanager的dsl拨号无法使用
[X]unzip,unrar,zip(natspec标记)
[X]hwclock 内核RTC支持
Sun 03 Mar 2013 11:47:18 AM CST
[X]重新配置内核,添加摄像头支持
[^4]: 后来发现acpi没用,powerdevil就够用了。另为唤醒后亮度失控的问题找到解决方法了arch的wiki,在内核启动行加上acpi_osi=Linux acpi_backlight=vendor
警告:以下内容建议别看,保护好节操和三观
The way a crow
Shook down on me
The dust of snow
From a hemlock tree
Has given my heart
A change of mood
And saved some part
Of a day I had rued.
两天前在吴都路景观道上一个人走着,飘落的大雪和忽然鸣叫的乌鸦,那时那刻的情境与即将考研结束的欣喜心情,这首诗好像水到渠成似的被忆起,美丽的诗句长久地回荡在心中。
即将从大雪滚蛋的欣喜与对景物朋友的怀念感伤,即将了却一段心事的轻松与名对不可知的未来的紧张,对舍我其谁的自信与琢磨不清无法战胜的自卑,欲闯荡天涯的决心与对家人的眷恋与羁绊,万千情愫,在万籁俱静的夜里,在惨惨淡淡的昏黄路灯下如满天飞雪一般交织,模糊,空灵而渺远。感觉好像要融化在无边无尽的夜中,失去自我与世界的界限。
目录
这一年,在考研与工作的矛盾,折腾实践与看书学习的矛盾,无限折腾与身体保养与锻炼之间的矛盾、极端反娱乐和身处娱乐大环境的矛盾、实践过程积累的自信和面对前途无力的自卑之间的矛盾、趋独和谋求与他人合作之间的矛盾,本专业渐进转型和彻底决绝地跨专业的矛盾的运动中不断前进上升。每个阶段主要矛盾都不同,而每个矛盾在不同的历史阶段作用和影响也不同。
这一年,是积极进步的一年,是不断学习与自我完善的一年,是不断促进自我与世界和谐的一年,是不断思索求生存谋发展的一年,也是充满曲折道路,探索光明前途的一年。这是一路蹒跚前进充满着血的教训的一年,然而我还没挂!!这是积累了我终生受用的宝贵经验的一年。
带着些许的狂热开源精神进入2012,继续进行漫无目的的折腾。
一月二十八号看到Phoenix在ubuntu中文论坛教怎么申请免费域名免费空间建立一个wordpress空间。然后在家折腾了一晚上,建立了我的第一个wordpress网站。建立个人分享网站的愿望几个月前就深植心中了,漫无目的的尝试了n次。这是第一次成功实践。但免费网站空间非常之慢。
不久之后又看到丘迟的维基世界,又搜到好几个vimwiki建立的个人网站,然后抱着试试看的心理试了下ruchee的css,接着开始深入用vimwiki建站。
vimwiki建立的静态站点开始放在免费空间上,现在还在http://reverland.cu.cc/,后来改版后放在github上,最后迁移到bitbucketreverland.bitbucket.org。在这里赫然列着我自己都懒得去看的从二月某日到四月某日每天的日记,无边的折腾笔记。
其实丘迟的网站很早就看到了,一直不知道他在讲什么,只感觉很牛逼……随着实践-认识-再实践-再认识,我才不断理解和能动地改造出符合自己实际需求相结合的个人网站。
直到某日又看到soimort天花乱坠的jekyll网站,我一激动就迁移到jekyll了。
其实jekyll和Octopress在2011年就听说了,可是一直懒得迁移。当时什么也看不懂,折腾失败……
之后大半年,除了tk域名连个邮件提醒都没的被收回,从Phoenix入手域名外,一直稳定维护jekyll网站。
忘记什么时候了,懒得折腾前端页面啥的,看到skydark非常漂亮功能全面的博客,直接 剽窃 来了,然后换了个twitter bootstrap的主题。
之后偶尔零星收到有关评论和感谢信都是很开心的。
断断续续的archlinux wiki的翻译
perl和R,在新的一年到来前就忘得一干二净。
偶尔用用bash
LaTeX,如果这算语言的吧,珍爱生命,远离排版。2012年除了写了几次作业再没用过,即使用也是用模板。还尝试了一次lyx。
Common Lisp,受liutos热情影响,掉进这个大坑了,然后把land of lisp看完了,看完的第一本原版书。读书笔记点此
html和css,折腾网站你不得不学的东西。
Python,最熟悉的语言了,模块和库太方便了,相比lisp而言。看了一阵《python与科学计算》。
cpp,大学的酱油课,差点挂掉。
一点点scheme,纯粹之美。
高数的复习,打下坚实数学基础
基于开源工具的数据分析。某次去图书馆不小心看到了,然后什么考研直接被我扔掉了。不过后来才看到有中文版。江南大学图书馆有本影印版,现在还在我手里,有本中文版,不知道有人借走了没。
一些数学建模时的东西、机器学习算法、概率论与数理统计知识。
看了部分gimp手册和在翻译scipy-lecture-notes时积累了些色彩理论和图像处理方面的基础。然后随便折腾了些。
专业课信号与系统,感觉学了不少东西,纯数学。
政治学习,现在说话办事满脑子马克思主义观点立场方法,一讲话一套一套的……
打好了数学基础
几天前论文发了,算是彻底的结束了。趁着学习实践了好多东西,还用了半年的免费网络。总结见此。
大学混了一年,对这屌地方提不起一点兴趣,甚至感觉碍手碍脚。不过学校很多方面就是好啊。混得最后的课差点挂掉。
严重的独立倾向,疏于与同学朋友交流联系,共同学习和进步。
学会了一边唱最炫民族风一边马步舞 和 八九十套广播体操。
无边无尽的水论坛和贴吧,byr,baidu linux吧,archlinux吧是我的常驻。话说byr上我的发帖都上千了,贴吧不到一年9级……
其它,如果还有什么特别重要的?
一些事情和要注意的地方。
尊重客观规律,理论联系实际,一切以时间、地点、条件为转移,具体问题具体分析。
坚持以人为本,始终把他人满意不满意,他人高兴不高兴,他人的想法和可能采取的行动放在考虑的第一位,把人的因素放在第一位。
身体第一,这是一切折腾与妥协的根本底线,不容置疑。
时间宝贵,道路是曲折的,前途是光明的。
团结一切可以团结的力量。
要正确处理好理想与现实之间的矛盾:
Mon 07 Jan 2013 08:08:27 PM CST
By Reverland
互联网上有很多视频网站,提供大量视频。可是大多都要求你使用它提供的专有软件才能下载,或者根本没提供下载的地方。在linux下怎么办?总是有办法的。浏览器扩展,you-get,直接从硕鼠解析出地址自己下载……
这不是重点,重点是:自己动手玩一玩。
urllib、urllib2、re。都是随便看看。
简单起见,直接从硕鼠抓取地址。
首先我们随便找一个视频地址,比如来自sina的憨豆特工。我们把地址用硕鼠解析出来看看:

哇哦,一个电影被分成15个文件了。
我们接下来要做的就是抓取这十五个视频的地址并把他们下载下来。
也许,用正则是个不错的办法。查看该页面源码,可以找到这样的内容:
<input type="hidden" name="inf" value="<R>憨豆特工
<T>0
<F>http://video.sina.com.cn/v/b/56925622-2257301331.html
<QX>normal
<$>
<N>憨豆特工-0001
<P>新浪网
<U>http://edge.v.iask.com/56926940.hlv?KID=sina,viask&Expires=1354550400&ssig=0G8Acouy32
<X>0001
<C>aHR0cDovL3YuaWFzay5jb20vdl9wbGF5LnBocD92aWQ9NTY5MjU2MjItMjI1NzMwMTMzMSZyPXZpZGVvLnNpbmEuY29tLmNu
<EXPLODEID>1
<&>
<$>
<N>憨豆特工-0002
<P>新浪网
<U>http://edge.v.iask.com/56921791.hlv?KID=sina,viask&Expires=1354550400&ssig=aDBPWf%2B2YH
<X>0001
<C>aHR0cDovL3YuaWFzay5jb20vdl9wbGF5LnBocD92aWQ9NTY5MjU2MjItMjI1NzMwMTMzMSZyPXZpZGVvLnNpbmEuY29tLmNu
<EXPLODEID>2
<&>
<$>
<N>憨豆特工-0003
<P>新浪网
......
显然,<N>后面是片名而<U>后面是地址。
另外,我们观察一下硕鼠当前页面的url地址。
http://www.flvcd.com/parse.php?kw=http%3A%2F%2Fvideo.sina.com.cn%2Fv%2Fb%2F56925622-2257301331.html
显然,kw参数后面是之前sina视频页面地址,只不过已经经过转码处理。
至此,足够我们用python来完成这一切了。
打开ipython:
In [1]: import urllib
In [2]: import urllib2
In [3]: videourl = 'http://video.sina.com.cn/v/b/56925622-2257301331.html'
In [4]: url = 'http://www.flvcd.com/parse.php?kw=' + urllib.quote(videourl)
In [5]: req = urllib2.Request(url);
In [6]: req.add_header('host', 'www.flvcd.com');
In [7]: res = urllib2.urlopen(req)
In [8]: html = res.read()
In [9]: print unicode(html,'gbk') # 注意硕鼠的页面编码是charset=GB2312
至此,我们完成了从硕鼠读取整个网页的操作。并把读取的内容保存在html中。
接下来开始抓地址,根据之前的观察,很容易通过正则表达式完成:
In [13]: import re
In [14]: pattern = re.compile('<input\s+type="hidden"\s+name="inf"\s+value="([^"]+)')
In [15]: match = pattern.search(html)
In [16]: urls = match.group(1)
In [17]: urls = unicode(urls, 'gbk')
In [18]: urlpattern = re.compile('<[NU]>(.+)')
In [19]: result = urlpattern.findall(urls)
至此,<N>和<U>后面的文件名和地址都被以列表的形式保存在result中了。我们可以遍历它来完成下载:
先简单处理下,以文件名-地址成对保存:
In [28]: data = [result[i:i+2] for i in range(0, len(result), 2)]
然后遍历下载:
In [32]: for k, v in enumerate(data):
print ' >downloading Block %.2d ...' % (k+1,)
urllib.urlretrieve(v[1], v[0] + '.flv')
print ' downloaded Block.%.2d completely<' % (k+1,)
然后?等着……目前的下载器相当简陋,木有进度条,木有断点……
之后就是合并flv的问题了。
简单起见,直接用这里join_flv.py来完成。
python2 join_flv.py -o out.flv flv1.flv flv2.flv ...
如果你想深入了解flv文件结构,参考further reading部分和flv文件规范。

抓取这里的视频。并按名称保存他们:
作为正则和urllib、urllib2的练习。